package de.fhhannover.inform.wari.grp8.gui;

import java.awt.Color;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JOptionPane;

import de.fhhannover.inform.studienklassen.semester3.GeneralStatics;
import de.fhhannover.inform.wari.grp8.spiel.GameFlow;

/**
 * 
 * @author Oleg Starodubtsev erstellt am 10.11.08 updatetd on 18.11.08 by
 *         michael antemann. imlementierung der update methode und saveprev
 *         update 09.12.08 dispose von new game popup nach oben gesetzt, für ki
 *         gegen ki spiele
 */
public class Gui_Controller  implements Observer, Runnable {
	private GameFlow mFlow = new GameFlow();
	private HelpMenu mHM; // Sofia
	private Gui mGui = new Gui(this, "Wari Gruppe8");;
	private NewGamePopupDialog mNgpd;
	private Menu mMenu;
	private StrategyGui strGuiA = new StrategyGui("A", this);
	private StrategyGui strGuiB = new StrategyGui("B", this);
	private int time = 5;
	private Object mArg;
	// Esan
	public Gui_Controller(GameFlow sfluss) {
		super();
		mFlow = sfluss;
		// this.run();
		// mFlow.getBoard().addObserver(this);
		initGui_Controller();
		mGui.setMenu(mMenu);
		mGui.setVisible(true);
	}

	public void initGui_Controller() {
		mMenu = new Menu(this);
		mNgpd = new NewGamePopupDialog(this);
		mHM = new HelpMenu(this);

	}

	public void newGame() {
		mNgpd.setVisible(true);
		mGui.setStatusMsg(" :: Spieleinstellungen vornehmen");
	}

	public void endGame() {
		mGui.dispose();
		mNgpd.dispose();
		mFlow.endgame();
	}

	/* updated on 14.11.08 by Shanmugaesan */

	public void savePreferences(boolean modusA, boolean modusB,
			String spielerNameA, String spielerNameB, boolean starter) {
		// System.out.println("ggnameA:"+spielerNameA+", nameB:"+spielerNameB+"modusA:"+modusA+", modusB:"+modusB+", starter:"+starter);
		mNgpd.dispose();
		// Board b= mFlow.getBoard();
		mFlow.addObserver(this);
		try {
			mFlow
					.startGame(spielerNameA, spielerNameB, modusA, modusB,
							starter);
		} catch (SecurityException se) {
			// TODO Auto-generated catch block
			se.printStackTrace();
		}
		// mFlow.getBoard().addObserver(this);
		// popup beenden
	}

	public void setKIPreferences(boolean whichKI, String stratName) {
		if (whichKI) {
			mFlow.setStrategyNameA(stratName);
			mFlow.setNameA(stratName);
		} else {
			mFlow.setStrategyNameB(stratName);
			mFlow.setNameB(stratName);
		}
	}

	public void chooseKI(boolean whichTable) { // true : KItable A , false :
												// KItable B
		if (whichTable)
			strGuiA.setVisible(true);
		else
			strGuiB.setVisible(true);
	}

	public void forwardMove(int muldenIndex) {
		// move erwartet werte 0-11, ne kleine rechnung ist schneller als das
		// array umzdrehen und aneinadenr zu hänegn
		if (!mFlow.getWhoesTurn())
			muldenIndex = (6 - muldenIndex) + 5;
		mFlow.move(muldenIndex);
	}

	public Color getColor() {
		// return new Color(219,236,193); //Nicht aendern, Verboten, Sofia :)
		return new Color(254, 207, 118); // Nicht aendern, Verboten, Sofia :)

	}
	public void run(){
		int[] pitsB = GeneralStatics.twistArray(mFlow.getPitsB());
		int[] board = GeneralStatics.connectArray(mFlow.getPitsA(), pitsB);
		int[] wPits = { mFlow.getWinPitA(), mFlow.getWinPitB() };
		// pruefe auf spielende variable oder mache rest
		// bei spiel ende zeige finish schirm mitsiegerehrung, starte neues
		// spiel?
		// System.out.println(GeneralStatics.intArrayToString(board));

		if (mFlow.isRunning()) {
			if (mArg.toString().contains("Gezogen")
					|| (mArg.toString().contains("Genommen"))
					|| (mArg.toString().contains("Begonnen"))) {
				if (mFlow.getWhoesTurn()) {
					mGui.updatePitsA(mFlow.getPitsA(), time);
					mGui.updatePitsB(pitsB, time);
				} else {
					mGui.updatePitsB(pitsB, time);
					mGui.updatePitsA(mFlow.getPitsA(), time);
				}

				mGui.updateGewinnMulden(wPits);
				mGui.setGewinnMuldenLabel(wPits);
			}
		}
		// mGui.setMuldenLabel(board);
		if(mArg.toString().contains("Namen")){
		mGui.setSpielerA(mFlow.getNameA());
		mGui.setSpielerB(mFlow.getNameB());
		}
		if(mArg.toString().contains("Reihe")){
		mGui.setTurnImg(mFlow.getWhoesTurn());
		}
		// leere mulden deaktivieren,
		// A ist dran und Mensch
		if (mFlow.getWhoesTurn() && !mFlow.getTypeA()) {
			mGui.activateBoard(true, false);
			mGui.deactivateBoard(true, mFlow.getPitsA());
		}
		// B ist dran und Mensch
		else if (!mFlow.getWhoesTurn() && !mFlow.getTypeB()) {
			mGui.activateBoard(false, true);
			mGui.deactivateBoard(false, pitsB);
		} else if (!mFlow.getWhoesTurn() && mFlow.getTypeB()) {
			mGui.activateBoard(false, false);
		} else if (mFlow.getWhoesTurn() && mFlow.getTypeA()) {
			mGui.activateBoard(false, false);
		}

		else {
			mGui.activateBoard(false, false); // beide Seiten vom Brett
												// graphisch deaktivieren
		}

		if (mArg != null) {
			mGui.setStatusMsg(mArg.toString());
			System.out.println(mArg.toString());
			if ((mArg.toString().indexOf("Have fun!")) != -1)
				JOptionPane
						.showMessageDialog(mGui, "Spiel startet. Have fun !");
			if ((mArg.toString().indexOf("Sieger:")) != -1) {
				JOptionPane.showMessageDialog(mGui, mArg.toString());
				// JOptionPane.showConfirmDialog(mGui,
				// "Spiel neustarten ?","Neues Spiel",
				// JOptionPane.YES_NO_OPTION);
				if (JOptionPane.showConfirmDialog(mGui, "Spiel neustarten ?",
						"Neues Spiel", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
					this.newGame();
				}
			}
		}
	}
	public void update(Observable o, Object arg) {
		mFlow.setUpdate(false);
		mArg= arg;
		this.run();
		mArg = null;
		
		mFlow.setUpdate(true);
		// mGui.deactivateBoard(!mFlow.getWhoesTurn());
		// System.out.println("ich bin guicon update");
	}

	public void openHelp() { // updated by Sofia
		mHM.setVisible(true);
	}
	/*
	 * public void setHelpMenu(HelpMenu hm){ // HelpMenuObjekt wird
	 * initialisiert (Oleg) mHM = hm; }
	 */
}
